package org.jrs.adaptadorDeJuegos;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.Serializable;
import java.net.URL;
import java.util.Hashtable;

import javax.swing.JFrame;
import javax.swing.JLabel;

import org.jrs.adaptadorDeJuegos.visores.JuegoVisorGrabacion;

public abstract class JuegoAdaptador implements Runnable{

        private boolean encendido=true;
        private JFrame ventanas[]=new JFrame[2];
        private JuegoVisorGrabacion jfg=new JuegoVisorGrabacion(this);
        private Thread hilo=new Thread(this);
        private int tiempoRepintar=100;
        private int ventanaActiva=0;
        private int ticksInactividad=0;
        private BufferedImage bi[]=new BufferedImage[2];
        private Graphics gi[]=new Graphics[2];
       
        private int ticksDeGrabacion=10;

        private Class imagenesClase=null;
        private Hashtable<String, Image> imagenes=new Hashtable<String, Image>();
       
        public JuegoAdaptador(){
                this(100);
        }
       
        public JuegoAdaptador(Class imagenesClase){
                this(100);
                this.imagenesClase=imagenesClase;
        }

        public JuegoAdaptador(int tiempoRepintar, Class imagenesClase){
                this(tiempoRepintar);
                this.imagenesClase=imagenesClase;
        }
       
        public JuegoAdaptador(int tiempoRepintar){
                ventanas[0]=new JFrame();
                ventanas[0].setBounds(0,0,480,660);
                ventanas[0].setTitle("Ventana vertical");
                ventanas[0].setVisible(true);
                bi[0]=new BufferedImage(480, 640, BufferedImage.TYPE_4BYTE_ABGR);
                gi[0]=bi[0].getGraphics();
                ventanas[0].addMouseListener(new MouseAdapter() {
                        @Override
                        public void mousePressed(MouseEvent e) {
                                super.mousePressed(e);
                                eventoTocarPantalla(0, e.getX(), e.getY()-20);
                        }                      
                });

                ventanas[1]=new JFrame();
                ventanas[1].setBounds(480,0,640,500);
                ventanas[1].setTitle("Ventana horizontal");
                ventanas[1].setVisible(true);
                bi[1]=new BufferedImage(640, 480, BufferedImage.TYPE_4BYTE_ABGR);
                gi[1]=bi[1].getGraphics();
                ventanas[1].addMouseListener(new MouseAdapter() {
                        @Override
                        public void mousePressed(MouseEvent e) {
                                super.mousePressed(e);
                                eventoTocarPantalla(1, e.getX(), e.getY()-20);
                        }                      
                });            
               
                jfg.setVisible(true);
               
                eventoInicializar();
               
                this.tiempoRepintar=tiempoRepintar;
                hilo.start();
        }
       
        public void eventoInicializar(){
        }
       
        public void eventoPausa(){
        }

        public void eventoFinalizar(){
        }
       
        public void eventoTick(){
        }

        public void eventoPintar(int orientacion){
        }
       
        public void eventoTocarPantalla(int orientacion, int x, int y){
        }
       
        public Serializable eventoEstadoCapturar(){
                return null;
        }
       
        public void eventoEstadoReestablecer(Serializable s){
        }
       
        public boolean cargarImagen(String nombre){
                try{
                        if (imagenesClase!=null){
                                if (!imagenes.containsKey(nombre)){
                                        URL url=imagenesClase.getResource(nombre);
                                        Image i=Toolkit.getDefaultToolkit().getImage(url);
                                        MediaTracker mt=new MediaTracker(new JLabel());
                                        mt.addImage(i, 0);
                                        mt.waitForAll();
                                        imagenes.put(nombre, i);
                                }
                                return true;
                        }else{
                                System.out.println("No se ha enviado un clase en la ruta de imagenes");
                                return false;
                        }
                }catch(Exception e){
                        e.printStackTrace();
                        return false;
                }
        }
       
        public void pintarImagen(String nombre, int x, int y){
                if (cargarImagen(nombre)){
                        Image i=imagenes.get(nombre);
                        gi[ventanaActiva].drawImage(i, x, y, null);
                }
        }
       
        public void pintarLimpiar(){
                gi[ventanaActiva].clearRect(0,0,bi[ventanaActiva].getWidth(),bi[ventanaActiva].getHeight());
        }

        public void pintarLinea(int x1, int y1, int x2, int y2){
                gi[ventanaActiva].drawLine(x1, y1, x2, y2);    
        }
       
        public void pintarCuadradoRelleno(int x1, int y1, int ancho, int alto, int color){
                gi[ventanaActiva].setColor(new Color(color));
                gi[ventanaActiva].fillRect(x1, y1, ancho, alto);        
        }

        public void pintarCuadrado(int x1, int y1, int ancho, int alto, int color){
                gi[ventanaActiva].setColor(new Color(color));
                gi[ventanaActiva].drawRect(x1, y1, ancho, alto);        
        }

        private void pintarDobleBuffer(){
                ventanas[ventanaActiva].getGraphics().drawImage(bi[ventanaActiva], 0, 20, null);
        }
       
        public void finalizar(){
                encendido=false;
                try{
                        hilo.destroy();
                }catch(Exception e){}
        }
       
        public void run(){
                while(encendido){
                        try{
                                Thread.sleep(tiempoRepintar);
                        }catch(Exception e){
                        }
                        if (ticksInactividad==0){
                                eventoTick();
                        }else{
                                ticksInactividad--;
                        }
                        ventanaActiva=0;
                        pintarLimpiar();
                        eventoPintar(ventanaActiva);
                        pintarDobleBuffer();
                        ventanaActiva=1;
                        pintarLimpiar();
                        eventoPintar(ventanaActiva);
                        pintarDobleBuffer();
                        Serializable estado=eventoEstadoCapturar();
                        if (estado!=null){
                                if (ticksDeGrabacion<=0){
                                        ticksDeGrabacion=10;
                                        jfg.volcarEstado(estado);
                                }
                                jfg.actualizarInactividad();
                                ticksDeGrabacion--;
                        }
                }
                eventoFinalizar();
        }

        public int getTicksInactividad() {
                return ticksInactividad;
        }

        public void setTicksInactividad(int ticksInactividad) {
                this.ticksInactividad = ticksInactividad;
        }
       
        public int getValor(int orientacion, int valorVertical, int valorHorizontal){
                return valorVertical*(1-orientacion)+valorHorizontal*(orientacion);
        }



}

